package com.itheima.task;


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.itheima.common.utils.AliOssUtil;
import com.itheima.mapper.SetmealMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 定时任务
 */
@Component
@Slf4j
public class OssImgTask {
    @Autowired
    private SetmealMapper setmealMapper;
    @Autowired
    private AliOssUtil aliOssUtil;

    @Autowired
    private StringRedisTemplate redisTemplate; // 注入 Redis 模板

    @Scheduled(cron="0 0 3 * * ? ")
    public void deleteImg(){
        log.info("处理重复图片：{}", new Date());
        //1.把套餐表里面的图片放到一个集合中
        List<String> setmealImgList = setmealMapper.getImgList();

        log.info("表图片：{}", setmealImgList);

        // 将 List 中的值放入 Redis 的 Set 集合中
        String redisKey = "tableImages"; // 定义 Redis Set 的键名
        setmealImgList.forEach(img -> redisTemplate.opsForSet().add(redisKey, trimFromComSlash(img)));

        //2.把oss中的图片放到一个集合中
        List<String> ImgList = aliOssUtil.getImagesFromOss();
        String redisOssKey = "uniqueImages"; // 定义 Redis Set 的键名
        ImgList.forEach(img -> redisTemplate.opsForSet().add(redisOssKey, img));
        log.info("OSS图片：{}", ImgList);
        //3.比较两个结合，得到两个和集合差集
        Set<String> difference =  redisTemplate.opsForSet().difference(redisOssKey,redisKey);

        log.info("差集是：{}", difference);
        if(difference.size()>0){
            difference.forEach(img -> {
                //4.删除多余图片
                aliOssUtil.delete(img);
            });
        }
        log.info("----------------------删除对于图片成功！----------------------------");
    }


    // 新增方法：从字符串最后开始往前截取，遇到"com/"停止，如果没有遇到“com/”，则返回全部字符串
    private String trimFromComSlash(String input) {
        if (input == null || !input.contains("com/")) {
            return input;
        }

        int index = input.lastIndexOf("com/");
        if (index != -1) {
            return input.substring(index + 4);
        } else {
            return input;
        }
    }
}